home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / misc / emu / ATUtil-PCSide.lha / ATUtilities-PCSide / m2 / turbosys.mod < prev    next >
Encoding:
Modula Implementation  |  2000-10-07  |  7.2 KB  |  399 lines

  1. (*$S-, $R-, $A-, $T- *)
  2. IMPLEMENTATION MODULE TurboSys;
  3.  
  4. FROM SYSTEM  IMPORT ADR,ADDRESS,OFS,SEG,ASSEMBLER;
  5. FROM System  IMPORT AX,BX,CX,DX,ES,DI,DS,SI,BP,Trap,XTrap,GetVector,Terminate;
  6. FROM Strings IMPORT Assign;
  7. FROM Storage IMPORT ALLOCATE,DEALLOCATE;
  8. FROM Loader  IMPORT Execute;
  9. FROM InOut   IMPORT WriteString,WriteLn;
  10. FROM Break   IMPORT InstallBreakHandler,UninstallBreakHandler,EnableBreak;
  11.  
  12. PROCEDURE WriteText(a,x,y : CARDINAL;
  13.                     text  : STRING);
  14. BEGIN
  15.  AX := 00000H;
  16.  BX := a;
  17.  CX := x;
  18.  DX := y;
  19.  ES := text.SEG;
  20.  DI := text.OFS;
  21.  XTrap(interruptVector);
  22. END WriteText;
  23.  
  24. PROCEDURE Fill(attribut,
  25.                x,y,w,h,
  26.                zeichen   : CARDINAL);
  27. BEGIN
  28.  AX := 00001H;
  29.  BX := attribut;
  30.  CX := x;
  31.  DX := y;
  32.  DS := w;
  33.  SI := h;
  34.  DI := zeichen;
  35.  XTrap(interruptVector);
  36. END Fill;
  37.  
  38. PROCEDURE SetCursor(x,y : CARDINAL);
  39. BEGIN
  40.  AX := 0002H;
  41.  BX := x;
  42.  CX := y;
  43.  Trap(interruptVector);
  44. END SetCursor;
  45.  
  46. PROCEDURE RestoreCursor;
  47. BEGIN
  48.  AX := 0003H;
  49.  Trap(interruptVector);
  50. END RestoreCursor;
  51.  
  52. PROCEDURE CopyVideo2Buffer(buffer  : ADDRESS;
  53.                            x,y,w,h : CARDINAL);
  54. BEGIN
  55.  AX := 0004H;
  56.  BX := x;
  57.  CX := y;
  58.  DX := w;
  59.  DS := h;
  60.  ES := buffer.SEG;
  61.  DI := buffer.OFS;
  62.  XTrap(interruptVector);
  63. END CopyVideo2Buffer;
  64.  
  65. PROCEDURE CopyBuffer2Video(buffer  : ADDRESS;
  66.                            x,y,w,h : CARDINAL);
  67. BEGIN
  68.  AX := 0005H;
  69.  BX := x;
  70.  CX := y;
  71.  DX := w;
  72.  DS := h;
  73.  ES := buffer.SEG;
  74.  DI := buffer.OFS;
  75.  XTrap(interruptVector);
  76. END CopyBuffer2Video;
  77.  
  78. PROCEDURE MouseReset;
  79. BEGIN
  80.  AX := 00100H;
  81.  Trap(interruptVector);
  82. END MouseReset;
  83.  
  84. PROCEDURE MouseOn;
  85. BEGIN
  86.  AX := 00101H;
  87.  Trap(interruptVector);
  88. END MouseOn;
  89.  
  90. PROCEDURE MouseOff;
  91. BEGIN
  92.  AX := 00102H;
  93.  Trap(interruptVector);
  94. END MouseOff;
  95.  
  96. PROCEDURE GetMousePosition(VAR x,y : CARDINAL;
  97.                            VAR b   : MouseButtonSet);
  98. BEGIN
  99.  AX := 00103H;
  100.  Trap(interruptVector);
  101.  x := tdos^.mouseX;
  102.  y := tdos^.mouseY;
  103.  b := tdos^.mouseButtons;
  104. END GetMousePosition;
  105.  
  106. PROCEDURE OpenScreen;
  107. BEGIN
  108.  AX := 00200H;
  109.  Trap(interruptVector);
  110. END OpenScreen;
  111.  
  112. PROCEDURE CloseScreen;
  113. BEGIN
  114.  AX := 00201H;
  115.  Trap(interruptVector);
  116. END CloseScreen;
  117.  
  118. PROCEDURE OpenWindow(titel   : ARRAY OF CHAR;
  119.                      x,y,w,h : CARDINAL;
  120.                      flgs    : WindowFlagSet;
  121.                      mw,mh   : CARDINAL) : WindowPtr;
  122. VAR win : WindowPtr;
  123. BEGIN
  124.  ALLOCATE(win,SIZE(Window));
  125.  IF (win=NIL) THEN
  126.   Terminate(0);
  127.  END (* IF *);
  128.  WITH win^ DO
  129.   leftEdge := x;
  130.   topEdge  := y;
  131.   width    := w;
  132.   height   := h;
  133.   flags    := flgs;
  134.   IF (windowSizing IN flgs) THEN
  135.    bufferSize := tdos^.videoSize;
  136.   ELSE
  137.    bufferSize := (w+1)*(h+2)*2;
  138.   END (* IF *);
  139.   Assign(titel,win^.title);
  140.   ALLOCATE(buffer,bufferSize);
  141.   IF (buffer=NIL) THEN
  142.    Terminate(0);
  143.   END (* IF *);
  144.   minWidth  := mw;
  145.   minHeight := mh;
  146.  END (* WITH *);
  147.  AX := 0202H;
  148.  ES := win.SEG;
  149.  DI := win.OFS;
  150.  XTrap(interruptVector);
  151.  RETURN(win);
  152. END OpenWindow;
  153.  
  154. PROCEDURE SetAPen(farbe : CARDINAL);
  155. BEGIN
  156.  AX := 0203H;
  157.  BX := farbe;
  158.  Trap(interruptVector);
  159. END SetAPen;
  160.  
  161. PROCEDURE SetBPen(farbe : CARDINAL);
  162. BEGIN
  163.  AX := 0204H;
  164.  BX := farbe;
  165.  Trap(interruptVector);
  166. END SetBPen;
  167.  
  168. PROCEDURE Move(x,y : CARDINAL);
  169. BEGIN
  170.  AX := 0205H;
  171.  BX := x;
  172.  CX := y;
  173.  Trap(interruptVector);
  174. END Move;
  175.  
  176. PROCEDURE Text(text : ARRAY OF CHAR);
  177. VAR adr : ADDRESS;
  178. BEGIN
  179.  AX := 0206H;
  180.  Assign(text,tdos^.help);
  181.  adr := ADR(tdos^.help);
  182.  ES := adr.SEG;
  183.  DI := adr.OFS;
  184.  XTrap(interruptVector);
  185. END Text;
  186.  
  187. PROCEDURE ShowMenu(menu : MenuPtr);
  188. BEGIN
  189.  AX := 0207H;
  190.  ES := menu.SEG;
  191.  DI := menu.OFS;
  192.  XTrap(interruptVector);
  193. END ShowMenu;
  194.  
  195. PROCEDURE SystemManager;
  196. BEGIN
  197.  AX := 02FFH;
  198.  Trap(interruptVector);
  199. END SystemManager;
  200.  
  201. PROCEDURE ShowHelp(t1,t2 : ARRAY OF CHAR);
  202. VAR a1,a2 : ADDRESS;
  203. BEGIN
  204.  a1 := ADR(t1);
  205.  a2 := ADR(t2);
  206.  AX := 0208H;
  207.  ES := a1.SEG;
  208.  DI := a1.OFS;
  209.  BX := a2.SEG;
  210.  CX := a2.OFS;
  211.  XTrap(interruptVector);
  212. END ShowHelp;
  213.  
  214. PROCEDURE ShowGadget(gad : GadgetPtr);
  215. BEGIN
  216.  AX := 0209H;
  217.  ES := gad.SEG;
  218.  DI := gad.OFS;
  219.  XTrap(interruptVector);
  220. END ShowGadget;
  221.  
  222. PROCEDURE MoveWindow(x,y : CARDINAL);
  223. BEGIN
  224.  AX := 020AH;
  225.  BX := x;
  226.  CX := y;
  227.  Trap(interruptVector);
  228. END MoveWindow;
  229.  
  230. PROCEDURE SizeWindow(w,h : CARDINAL);
  231. BEGIN
  232.  AX := 020BH;
  233.  BX := w;
  234.  CX := h;
  235.  Trap(interruptVector);
  236. END SizeWindow;
  237.  
  238. PROCEDURE CloseWindow;
  239. VAR win : WindowPtr;
  240. BEGIN
  241.  win := tdos^.firstWindow;
  242.  IF (win # NIL) THEN
  243.   AX := 020CH;
  244.   Trap(interruptVector);
  245.   DEALLOCATE(win^.buffer,win^.bufferSize);
  246.   DEALLOCATE(win,SIZE(Window));
  247.  END (* IF *);
  248. END CloseWindow;
  249.  
  250. PROCEDURE CenterText(y    : CARDINAL;
  251.                      text : ARRAY OF CHAR);
  252. VAR adr : ADDRESS;
  253. BEGIN
  254.  Assign(text,tdos^.help);
  255.  adr := ADR(tdos^.help);
  256.  AX := 020DH;
  257.  BX := y;
  258.  ES := adr.SEG;
  259.  DI := adr.OFS;
  260.  XTrap(interruptVector);
  261. END CenterText;
  262.  
  263. PROCEDURE DrawX(farbe,x,y,l,zeichen : CARDINAL);
  264. BEGIN
  265.  AX := 0006H;
  266.  BX := farbe;
  267.  CX := x;
  268.  DX := y;
  269.  DS := l;
  270.  SI := zeichen;
  271.  XTrap(interruptVector);
  272. END DrawX;
  273.  
  274. PROCEDURE DrawY(farbe,x,y,l,zeichen : CARDINAL);
  275. BEGIN
  276.  AX := 0007H;
  277.  BX := farbe;
  278.  CX := x;
  279.  DX := y;
  280.  DS := l;
  281.  SI := zeichen;
  282.  XTrap(interruptVector);
  283. END DrawY;
  284.  
  285. PROCEDURE ModifyProp(gad     : GadgetPtr;
  286.                      pos,max : CARDINAL);
  287. BEGIN
  288.  AX := 020FH;
  289.  BX := pos;
  290.  CX := max;
  291.  ES := gad.SEG;
  292.  DI := gad.OFS;
  293.  XTrap(interruptVector);
  294. END ModifyProp;
  295.  
  296. PROCEDURE LineH(x,y,l : CARDINAL);
  297. BEGIN
  298.  AX := 0210H;
  299.  BX := x;
  300.  CX := y;
  301.  DX := l;
  302.  Trap(interruptVector);
  303. END LineH;
  304.  
  305. PROCEDURE LineV(x,y,l : CARDINAL);
  306. BEGIN
  307.  AX := 0211H;
  308.  BX := x;
  309.  CX := y;
  310.  DX := l;
  311.  Trap(interruptVector);
  312. END LineV;
  313.  
  314. PROCEDURE Char(x,y,zeichen : CARDINAL);
  315. BEGIN
  316.  AX := 0212H;
  317.  BX := x;
  318.  CX := y;
  319.  DX := zeichen;
  320.  Trap(interruptVector);
  321. END Char;
  322.  
  323. PROCEDURE Box(x,y,w,h : CARDINAL);
  324. BEGIN
  325.  AX := 0213H;
  326.  BX := x;
  327.  CX := y;
  328.  DX := w;
  329.  ES := h;
  330.  XTrap(interruptVector);
  331. END Box;
  332.  
  333. PROCEDURE Redraw;
  334. BEGIN
  335.  AX := 0214H;
  336.  Trap(interruptVector);
  337. END Redraw;
  338.  
  339. PROCEDURE ExecuteApplication(name : ARRAY OF CHAR;
  340.                              args : ARRAY OF CHAR;
  341.                              dos  : BOOLEAN) : CARDINAL;
  342. VAR win  : WindowPtr;
  343.     cp,a : CARDINAL;
  344. BEGIN
  345.  win := tdos^.firstWindow;
  346.  cp  := tdos^.cursorPos;
  347.  
  348.  IF (dos=TRUE) THEN
  349.   AX := 0300H;
  350.   Trap(interruptVector);
  351.  END (* IF *);
  352.  
  353.  tdos^.firstWindow := NIL;
  354.  tdos^.cursorPos  := 05050H;
  355.  Execute(name,args,a);
  356.  tdos^.firstWindow := win;
  357.  tdos^.cursorPos   := cp;
  358.  
  359.  IF (dos=TRUE) THEN
  360.   WriteLn;
  361.   WriteString("Drcken Sie eine beliebige Taste, um zu TurboDOS zurckzukehren.");
  362.   AX := 0;
  363.   Trap(016H);
  364.   AX := 0301H;
  365.   Trap(interruptVector);
  366.  END (* IF *);
  367.  
  368.  RestoreCursor;
  369.  RETURN(a);
  370. END ExecuteApplication;
  371.  
  372. PROCEDURE CheckTDOS;
  373. VAR seg,ofs,ok : CARDINAL;
  374. BEGIN
  375.  seg := tdos.SEG;
  376.  ofs := tdos.OFS;
  377.  ok  := 0;
  378.  ASM
  379.   MOV ES,seg
  380.   MOV DI,ofs
  381.   MOV AL,ES:[DI]
  382.   MOV BL,ES:[DI+1]
  383.   MOV CL,ES:[DI+2]
  384.   MOV DL,ES:[DI+3]
  385.   CMP AL,"T"
  386.   JNE Nein
  387.   MOV ok,1
  388.  Nein:
  389.  END;
  390.  IF (ok=0) THEN tdos := NIL; END;
  391. END CheckTDOS;
  392.  
  393. BEGIN
  394.  GetVector(memoryVector,tdos);
  395.  CheckTDOS;
  396.  
  397. END TurboSys.
  398.  
  399.